package dao

import (
	"context"
	"github.com/gogf/gf/frame/g"
	"github.com/gogf/gf/net/ghttp"
)

const (
	// ContextKey 上下文变量存储键名，前后端系统共享
	ContextKey = "ContextKey"
	// DefaultAdminId 默认管理员ID
	DefaultAdminId = 1
)

var AppCtx = appCtx{}

type appCtx struct{}

// Context 请求上下文结构
type Context struct {
	Session *ghttp.Session // 当前Session管理对象
	User    *CtxUser       // 上下文用户信息
	Data    g.Map          // 自定KV变量，业务模块根据需要设置，不固定
}

// CtxUser 请求上下文中的用户信息
type CtxUser struct {
	ID       uint   `json:"id"`       // 用户id
	UserName string `json:"userName"` // 用户名
	Email    string `json:"email"`    // 邮箱
	Status   uint   `json:"status"`   // 用户状态;0:禁用,1:正常,2:未验证
	IsAdmin  bool   `json:"isAdmin"`  // 是否后台管理员 1 是  0   否
	Avatar   string `json:"avatar"`   //头像
}

// Init 初始化上下文对象指针到上下文对象中，以便后续的请求流程中可以修改。
func (s *appCtx) Init(r *ghttp.Request, customCtx *Context) {
	r.SetCtxVar(ContextKey, customCtx)
}

// Get 获得上下文变量，如果没有设置，那么返回nil
func (s *appCtx) Get(ctx context.Context) *Context {
	value := ctx.Value(ContextKey)
	if value == nil {
		return nil
	}
	if localCtx, ok := value.(*Context); ok {
		return localCtx
	}
	return nil
}

// SetUser 将上下文信息设置到上下文请求中，注意是完整覆盖
func (s *appCtx) SetUser(ctx context.Context, ctxUser *CtxUser) {
	if ctxUser.ID == DefaultAdminId {
		ctxUser.IsAdmin = true
	}
	s.Get(ctx).User = ctxUser
}

// SetData 将上下文信息设置到上下文请求中，注意是完整覆盖
func (s *appCtx) SetData(ctx context.Context, data g.Map) {
	s.Get(ctx).Data = data
}
